package com.product.config;

import com.product.shiro.ClientShiroThree;
import com.product.shiro.MyRealm;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 用户登录权限
 * 创建时间： 2021/3/20
 * 创建者： 王瑾
 * https://how2j.cn/k/shiro/shiro-plan/1732.html
 */
@Slf4j
@Configuration
public class ShiroConfig {
    @Bean
    public Realm myRealm() {
        return new MyRealm();
    }
    @Bean
    public DefaultWebSecurityManager securityManager() {
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm(myRealm());
        return manager;
    }
    // https://bbs.csdn.net/topics/392357164?list=51406241
    // Shiro集成swagger2时放行资源，正常访问swagger-ui.html
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean() {
        ShiroFilterFactoryBean filter = new ShiroFilterFactoryBean();
        // 必须设置 SecurityManager
        filter.setSecurityManager(securityManager());

        //加入自定义的filter
        Map<String, Filter> filterMap = filter.getFilters();
        filterMap.put("client", new ClientShiroThree());
        filter.setFilters(filterMap);
        //定义相关路径
        // setLoginUrl 如果不设置值，默认会自动寻找Web工程根目录下的"/login.jsp"页面 或 "/login" 映射
        filter.setLoginUrl("/login");
        // 设置无权限时跳转的 url;
        filter.setUnauthorizedUrl("/noAuthorize");
        //定义拦截路径,记得将静态资源也排除过滤
        /*进行权限的控制,必须使用LinkHashMap,shrio要按照顺序进行设置*/
        Map<String, String> authMap = new LinkedHashMap<>();
        /**
         *  /admin=authc,roles[admin]      表示用户必需已通过认证,并拥有admin角色才可以正常发起'/admin'请求
         *  /edit=authc,perms[admin:edit]  表示用户必需已通过认证,并拥有admin:edit权限才可以正常发起'/edit'请求
         *  /home=user     表示用户不一定需要已经通过认证,只需要曾经被Shiro记住过登录状态就可以正常发起'/home'请求
         */
        // 配置不会被拦截的链接 顺序判断
        //游客，开发权限 demo
//        authMap.put("/guest/**", "anon");
//        authMap.put("/static/**", "anon");
//        //用户，需要角色权限 “user”
//        authMap.put("/user/**", "client,roles[user]");
//        //管理员，需要角色权限 “admin”
//        authMap.put("/admin/**", "client,roles[admin]");
        //开放登陆接口
        authMap.put("/login", "anon");

        //放行Swagger2页面
        authMap.put("/swagger-ui.html", "anon");
        authMap.put("/swagger/**", "anon");
        authMap.put("/swagger-resources/**", "anon");
        authMap.put("/v2/**", "anon");
        authMap.put("/webjars/**", "anon");
        authMap.put("/configuration/**", "anon");

        //主要这行代码必须放在所有权限设置的最后，不然会导致所有 url 都被拦截
//        authMap.put("/**", "client");

        authMap.put("/**", "anon"); //全部放行
        filter.setFilterChainDefinitionMap(authMap);

        //配置完成
        log.info("---------------shirofactory创建成功");
        return filter;
    }

//    /**
//     * 开始Shiro 注解授权操作
//     * @param manager
//     * @return
//     */
//    @Bean
//    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager manager){
//        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
//        advisor.setSecurityManager(manager);
//        return advisor;
//    }
//
//    @Bean
//    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator(){
//        DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator();
//        proxyCreator.setProxyTargetClass(true);
//        return proxyCreator;
//    }
}